
namespace ShoppingCart.DataAccess
{
	using System;
	using System.Collections.Generic;
	using System.Data;
	using System.Data.Common;
	using Microsoft.Practices.EnterpriseLibrary.Data;
	using ShoppingCart.Business.Entity;

	/// <summary>
	/// Represents the DataAccess of DepartamentoData.
	/// </summary>
	public class DepartamentoData : Singleton<DepartamentoData>
	{
		#region Attributes

		private readonly Database BaseDatos = DatabaseFactory.CreateDatabase();

		#endregion

		#region Methods

		/// <summary>
		/// Selects all records from the Departamento table by a foreign key.
		/// </summary>
		public IList<Departamento> Listar(bool mostrarTodo)
		{
			var entidades = new List<Departamento>();
			var comando = BaseDatos.GetStoredProcCommand("SelectAllDepartamento");
		    BaseDatos.AddInParameter(comando, "MostrarTodo", DbType.Boolean, mostrarTodo);
			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new Departamento
					{
						IdDepartamento = lector.GetInt32(lector.GetOrdinal("IdDepartamento")),
						Nombre = lector.GetString(lector.GetOrdinal("Nombre")),
						Estado = lector.GetBoolean(lector.GetOrdinal("Estado"))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		/// <summary>
		/// Selects all records from the Departamento table by a foreign key.
		/// </summary>
		public Departamento Obtener(int idDepartamento)
		{
			var departamento = default(Departamento);
			var comando = BaseDatos.GetStoredProcCommand("SelectDepartamento");

			BaseDatos.AddInParameter(comando, "IdDepartamento", DbType.Int32, idDepartamento);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					departamento = new Departamento
					{
						IdDepartamento = lector.GetInt32(lector.GetOrdinal("IdDepartamento")),
						Nombre = lector.GetString(lector.GetOrdinal("Nombre")),
						Estado = lector.GetBoolean(lector.GetOrdinal("Estado"))
					};
				}
			}
			comando.Dispose();
			return departamento;
		}

		/// <summary>
		/// Saves a record to the Departamento table.
		/// </summary>
		public int Agregar(Departamento departamento)
		{
			var comando = BaseDatos.GetStoredProcCommand("InsertDepartamento");
			BaseDatos.AddInParameter(comando, "IdDepartamento", DbType.Int32, departamento.IdDepartamento);
			BaseDatos.AddInParameter(comando, "Nombre", DbType.String, departamento.Nombre);
			BaseDatos.AddInParameter(comando, "Estado", DbType.Boolean, departamento.Estado);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Agregar Departamento.");

			comando.Dispose();
			return 1;
		}

		/// <summary>
		/// Updates a record in the Departamento table.
		/// </summary>
		public bool Modificar(Departamento departamento)
		{
			var comando = BaseDatos.GetStoredProcCommand("UpdateDepartamento");
			BaseDatos.AddInParameter(comando, "IdDepartamento", DbType.Int32, departamento.IdDepartamento);
			BaseDatos.AddInParameter(comando, "Nombre", DbType.String, departamento.Nombre);
			BaseDatos.AddInParameter(comando, "Estado", DbType.Boolean, departamento.Estado);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Modificar Departamento.");

			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the Departamento table by its primary key.
		/// </summary>
		public bool Eliminar(int idDepartamento)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDepartamento");
			BaseDatos.AddInParameter(comando, "IdDepartamento", DbType.Int32, idDepartamento);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar Departamento.");
			comando.Dispose();
			return true;
		}

		#endregion
	}
}
